基本原理与实例代码 openpose输出的关键点信息如下图,总共有25个关节点 对应的关节名称如下: 使用的是余弦定理计算角度: 夹角用大写A、B、C表示,边长用小写a、b、c来表示,余弦定理的数学公式如下: python代码实例:
# keypoints_from_images.py
import sys
import cv2
import os
from sys import platform
import argparse
import time
import math
def angle_between_points( p0, p1, p2 ):
# 计算角度
a = (p1[0]-p0[0])**2 + (p1[1]-p0[1])**2
b = (p1[0]-p2[0])**2 + (p1[1]-p2[1])**2
c = (p2[0]-p0[0])**2 + (p2[1]-p0[1])**2
if a * b == 0:
return -1.0
return math.acos( (a+b-c) / math.sqrt(4*a*b) ) * 180 /math.pi
def length_between_points(p0, p1):
# 2点之间的距离
return math.hypot(p1[0]- p0[0], p1[1]-p0[1])
def get_angle_point(human, pos):
# 返回各个部位的关键点
pnts = []
if pos == 'left_elbow':
pos_list = (5,6,7)
elif pos == 'left_hand':
pos_list = (1,5,7)
elif pos == 'left_knee':
pos_list = (12,13,14)
elif pos == 'left_ankle':
pos_list = (5,12,14)
elif pos == 'right_elbow':
pos_list = (2,3,4)
elif pos == 'right_hand':
pos_list = (1,2,4)
elif pos == 'right_knee':
pos_list = (9,10,11)
elif pos == 'right_ankle':
pos_list = (2,9,11)
else:
print('Unknown [%s]', pos)
return pnts
for i in range(3):
if human[pos_list[i]][2] |